import type { UserInfo } from '@/types/user'

export interface ApiResponse<T = any> {
  statusCode: HttpStatus
  message: string
  data: T | null
  total?: number
}

export interface LoginApiResponse {
  access_token: string
  refresh_token: string
  user: UserInfo
}

export interface RegisterApiResponse {
  id: string
  username: string
  email: string
}

export interface CaptchaApiResponse {
  captchaId: string
  image: string
}

/**
 * 配置项类型定义
 */
export interface ConfigItem {
  id: number
  key: string
  value: string | number | boolean
  name: string
  description: string
  type: 'string' | 'boolean' | 'select' | 'json' | 'number'
  options:
    | {
        label: string
        value: string
      }[]
    | null
  system: boolean
  createdAt: string
  updatedAt: string
}

export enum HttpStatus {
  // 1xx 信息性状态码
  CONTINUE = 100, // 继续 - 服务器已收到请求头，客户端应继续发送请求体
  SWITCHING_PROTOCOLS = 101, // 切换协议 - 服务器同意客户端切换协议
  PROCESSING = 102, // 处理中 - 服务器正在处理请求
  EARLYHINTS = 103, // 提前提示 - 服务器发送的初步响应

  // 2xx 成功状态码
  OK = 200, // 成功 - 请求已成功处理
  CREATED = 201, // 已创建 - 请求已成功并创建了新资源
  ACCEPTED = 202, // 已接受 - 请求已接受但尚未处理完成
  NON_AUTHORITATIVE_INFORMATION = 203, // 非权威信息 - 服务器提供的信息不是来自原始源
  NO_CONTENT = 204, // 无内容 - 请求已成功处理但无返回内容
  RESET_CONTENT = 205, // 重置内容 - 请求已成功处理，客户端应重置文档视图
  PARTIAL_CONTENT = 206, // 部分内容 - 服务器成功处理了部分GET请求
  MULTI_STATUS = 207, // 多状态 - 包含多个资源的状态响应
  ALREADY_REPORTED = 208, // 已报告 - 资源已在先前的响应中报告
  CONTENT_DIFFERENT = 210, // 内容不同 - 服务器上的资源与客户端缓存的不同

  // 3xx 重定向状态码
  AMBIGUOUS = 300, // 模糊 - 请求有多个可能的响应
  MOVED_PERMANENTLY = 301, // 永久移动 - 资源已永久移动到新位置
  FOUND = 302, // 已找到 - 资源临时移动到新位置
  SEE_OTHER = 303, // 查看其他位置 - 应使用GET方法重定向到其他位置
  NOT_MODIFIED = 304, // 未修改 - 资源自上次请求后未修改
  TEMPORARY_REDIRECT = 307, // 临时重定向 - 资源临时移动，保持原方法
  PERMANENT_REDIRECT = 308, // 永久重定向 - 资源永久移动，保持原方法

  // 4xx 客户端错误状态码
  BAD_REQUEST = 400, // 错误请求 - 服务器无法理解请求
  UNAUTHORIZED = 401, // 未授权 - 请求需要用户认证
  PAYMENT_REQUIRED = 402, // 需要付款 - 保留状态码
  FORBIDDEN = 403, // 禁止 - 服务器拒绝请求
  NOT_FOUND = 404, // 未找到 - 请求的资源不存在
  METHOD_NOT_ALLOWED = 405, // 方法不允许 - 请求方法对资源不适用
  NOT_ACCEPTABLE = 406, // 不可接受 - 服务器无法满足请求的内容协商
  PROXY_AUTHENTICATION_REQUIRED = 407, // 需要代理认证 - 请求需要代理认证
  REQUEST_TIMEOUT = 408, // 请求超时 - 服务器等待请求超时
  CONFLICT = 409, // 冲突 - 请求与资源的当前状态冲突
  GONE = 410, // 已删除 - 请求的资源已永久删除
  LENGTH_REQUIRED = 411, // 需要长度 - 请求缺少Content-Length头
  PRECONDITION_FAILED = 412, // 预处理失败 - 请求的前置条件未满足
  PAYLOAD_TOO_LARGE = 413, // 有效载荷过大 - 请求体超过服务器限制
  URI_TOO_LONG = 414, // URI过长 - 请求的URI超过服务器限制
  UNSUPPORTED_MEDIA_TYPE = 415, // 不支持的媒体类型 - 请求的媒体类型不支持
  REQUESTED_RANGE_NOT_SATISFIABLE = 416, // 请求范围不满足 - 请求的范围无法满足
  EXPECTATION_FAILED = 417, // 期望失败 - 服务器无法满足Expect头
  I_AM_A_TEAPOT = 418, // 我是茶壶 - 服务器拒绝煮咖啡（幽默状态码）
  MISDIRECTED = 421, // 错误定向 - 请求被错误定向
  UNPROCESSABLE_ENTITY = 422, // 无法处理的实体 - 请求格式正确但语义错误
  LOCKED = 423, // 已锁定 - 资源被锁定
  FAILED_DEPENDENCY = 424, // 依赖失败 - 由于前一个请求失败而失败
  PRECONDITION_REQUIRED = 428, // 需要前置条件 - 请求必须包含前置条件
  TOO_MANY_REQUESTS = 429, // 请求过多 - 客户端发送了太多请求
  UNRECOVERABLE_ERROR = 456, // 不可恢复的错误 - 客户端存在不可恢复的错误

  // 5xx 服务器错误状态码
  INTERNAL_SERVER_ERROR = 500, // 内部服务器错误 - 服务器遇到未知错误
  NOT_IMPLEMENTED = 501, // 未实现 - 服务器不支持请求的功能
  BAD_GATEWAY = 502, // 错误网关 - 网关收到无效响应
  SERVICE_UNAVAILABLE = 503, // 服务不可用 - 服务器当前无法处理请求
  GATEWAY_TIMEOUT = 504, // 网关超时 - 网关等待上游服务器响应超时
  HTTP_VERSION_NOT_SUPPORTED = 505, // HTTP版本不支持 - 服务器不支持请求的HTTP版本
  INSUFFICIENT_STORAGE = 507, // 存储空间不足 - 服务器存储空间不足
  LOOP_DETECTED = 508, // 检测到循环 - 服务器检测到无限重定向循环,
}
